package utils;

import constant.ExceptionConstant;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.Timestamp;

public class CopyUtil {

    /**
     * 从 ResultSet 复制数据到泛型对象（支持 String、Integer、LocalDateTime 类型）
     * @param resultSet 数据库结果集
     * @param target 目标对象
     * @param <T> 对象类型
     */
    public static <T> void copyFromResultSet(T target, ResultSet resultSet) {
        if (resultSet == null || target == null) {
            return;
        }

        try {
            Class<?> clazz = target.getClass();
            Field[] fields = clazz.getDeclaredFields();

            for (Field field : fields) {
                String fieldName = field.getName();
                Class<?> fieldType = field.getType();

                // 使用类的全限定名进行比较，避免类加载器问题
                String typeName = fieldType.getName();

                try {
                    field.setAccessible(true);

                    if ("java.lang.String".equals(typeName)) {
                        String value = resultSet.getString(fieldName);
                        field.set(target, value);
                    } else if ("java.lang.Integer".equals(typeName) || "int".equals(typeName)) {
                        int value = resultSet.getInt(fieldName);
                        if (resultSet.wasNull()) {
                            if ("java.lang.Integer".equals(typeName)) {
                                field.set(target, null);
                            }
                        } else {
                            field.set(target, value);
                        }
                    } else if ("java.time.LocalDateTime".equals(typeName)) {
                        Timestamp timestamp = resultSet.getTimestamp(fieldName);
                        field.set(target, timestamp != null ? timestamp.toLocalDateTime() : null);
                    }
                } catch (Exception e) {
                    throw new RuntimeException(ExceptionConstant.PROPERTY_COPY_EXCEPTION);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}